package com.easyim.imserver.handler;

import com.easyim.common.message.Immessage;
import com.easyim.imserver.handler.message.Handler;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.Map;

import static com.easyim.imserver.constant.CacheKey.*;

@Slf4j
@Data
@Component
@ChannelHandler.Sharable
public class DispatchMessageHandler extends SimpleChannelInboundHandler<Immessage.ImMessage> {

    /**
     * 消息其实可以分为两种
     * 1  就是单纯的消息 用户a发送了 用户b接收
     * 2  是指令 告诉我们服务器端需要做什么  比如登陆指令 断连指令 目前只接收这两个指令 你问我为啥不接受其他呢？很简单 保持tcp最简单的连接
     */

    @Autowired
    @Qualifier("msgHandler")
    Map<String, Handler> handlerMap;

    // 如果使用的是jwt 如何解析 所以最简单的就是 配置 可以不认证
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext,
            Immessage.ImMessage imMessage) {
        //在这里放一个持有期。交给spring管理 这样子 rest方便管理了
        if (imMessage.hasCmdMessage()) {
            Immessage.CmdMessage.CommandType command = imMessage.getCmdMessage().getCommand();
            String name = command.name();
            handlerMap.get(name).handlerMsg(channelHandlerContext.channel(), imMessage);
        }else if (imMessage.hasDataMessage()) {
            handlerMap.get(DATA_MSG_HANDLER_KEY).handlerMsg(channelHandlerContext.channel(), imMessage);
        } else if (imMessage.hasAckMessage()){
            handlerMap.get(ACK_MSG_HANDLER_KEY).handlerMsg(channelHandlerContext.channel(), imMessage);
        }
    }








}
